package com.powernode.common;

import com.powernode.common.execption.PowerException;
import com.powernode.common.result.Result;
import feign.FeignException;
import feign.Response;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;

import java.io.IOException;
import java.lang.reflect.Type;

/**
 * Feign统一返回值处理器
 * 自定义Feign解码器，用于统一处理Feign远程调用的返回结果
 * 主要功能：检查Result对象的返回状态码，非200时抛出业务异常
 */
public class FeignCustomerDataDecoder implements Decoder {
    // SpringDecoder实例，用于实际的解码操作
    private SpringDecoder decoder;

    /**
     * 构造函数
     *
     * @param decoder SpringDecoder实例，用于实际的解码操作
     */
    public FeignCustomerDataDecoder(SpringDecoder decoder) {
        this.decoder = decoder;
    }

    /**
     * 解码Feign响应
     * 重写decode方法，对Feign调用的返回结果进行统一处理
     *
     * @param response Feign响应对象
     * @param type     目标类型
     * @return 解码后的对象
     * @throws IOException IO异常,DecodeException 解码异常,FeignException Feign异常
     */
    @Override
    public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
        // 使用SpringDecoder进行实际的解码操作，获取原始返回结果,发起远程调用获取返回结果
        Object object = this.decoder.decode(response, type);
        // 检查返回结果是否为Result类型
        if (object instanceof Result) {
            Result result = (Result) object;
            // 检查状态码，如果不是200（成功），则抛出业务异常
            if (result.getCode().intValue() != 200) {
                throw new PowerException(result.getCode(), result.getMessage());
            }
            // 返回成功的Result对象
            return result;
        }
        // 如果不是Result类型，直接返回原始对象
        return object;
    }
}
